#ifndef __VFIFO_H__
#define __VFIFO_H__

#include <stdint.h>
#include <errno.h>
#include <string.h>

#undef ENABLE_CROSS_DEVICE_BUILD
#define ENABLE_CROSS_DEVICE_BUILD   0

#undef __xfifo
#undef XFIFO_FUNC
#define __xfifo             vfifo
#define XFIFO_FUNC(name)        vfifo_##name

#undef __xmesg
#undef XMESG
#undef __XMESG_SIZE
#define __xmesg             vmesg
#define XMESG(name)			vmesg_##name
#define __XMESG_SIZE		64

#include "_fifo.h"

#if BUILD_VFIFO_INLINE
#define __static_inline         static inline
#include "_fifo.ch"
#else

#define __static_inline

struct __xfifo;

int vfifo_initialized(struct __xfifo *fifo);
int vfifo_init(struct __xfifo *fifo, void *data, uint32_t size, uint32_t esize);
uint32_t vfifo_size(struct __xfifo *fifo);
uint32_t vfifo_used_len(struct __xfifo *fifo);
uint32_t vfifo_unused_len(struct __xfifo *fifo);
int vfifo_is_empty(struct __xfifo *fifo);
int vfifo_is_full(struct __xfifo *fifo);
void *vfifo_data(struct __xfifo *fifo, uint32_t offset);
void *vfifo_data_mem(struct __xfifo *fifo);
int vfifo_enqueue_len(struct __xfifo *fifo, void *data, uint32_t len);
int vfifo_enqueue_overlay_len(struct __xfifo *fifo, void *data, uint32_t len);
int vfifo_dequeue_len(struct __xfifo *fifo, void *dest, uint32_t len);
int vfifo_peek_len(struct __xfifo *fifo, void *dest, uint32_t len);
int vfifo_skip_len(struct __xfifo *fifo, uint32_t len);
uint32_t vfifo_used_count(struct __xfifo *fifo);
uint32_t vfifo_unused_count(struct __xfifo *fifo);
int vfifo_enqueue(struct __xfifo *fifo, void *data);
int vfifo_enqueue_overlay(struct __xfifo *fifo, void *data);
int vfifo_dequeue(struct __xfifo *fifo, void *dest);
int vfifo_peek(struct __xfifo *fifo, void *dest);
int vfifo_skip(struct __xfifo *fifo);

#endif
#endif
